//: Playground - noun: a place where people can play

import UIKit

//: # swfit 读书笔记


//: ## 函数定义与调用
print("_____________________函数定义与调用_____________________________")
func fristFunction(fristParameter:String,secondParameter:String = "擎天柱"){
    print("fristParameter-\(fristParameter),secondParameter-\(String(describing: secondParameter))")
}
fristFunction(fristParameter: "sadf")
fristFunction(fristParameter: "zzp", secondParameter: "haha")
//: ## 函数参数与返回值

//: ## 函数参数标签和参数名称
//: ### 多重返回值函数 你可以用元组（tuple）类型让多个值作为一个复合值从函数中返回。
print("_____________________多重返回值函数_____________________________")
func minMax(array:[Int])->(Min:Int,Max:Int){
    var tempMIn:Int = array[0]
    var tempMax:Int = array[0]
    
    for value in array[1..<array.count] {
        
        if value<tempMIn {
            tempMIn = value
        }else if(value > tempMax){
            tempMax = value
        }
    }
    return(tempMIn,tempMax)
}

let bounds = minMax(array: [8, -6, 2, 109, 3, 71])
print(" bounds: min is \(bounds.Min),max is \(bounds.Max)")


//: ### 可选元组返回类型
print("_____________________可选元组返回类型_____________________________")

func maxMin(array:[Int]) -> (min:Int,max:Int)?{
    if array.isEmpty {
        return nil
    }
    var tempMIn:Int = array[0]
    var tempMax:Int = array[0]
    
    for value in array[1..<array.count] {
        
        if value<tempMIn {
            tempMIn = value
        }else if(value > tempMax){
            tempMax = value
        }
    }
    return(tempMIn,tempMax)
}

if let secondBounds = maxMin(array: [8, -6, 2, 109, 3, 71]) {
    print(" secondBounds: min is \(secondBounds.min),max is \(secondBounds.max)")
}

//: ## 函数参数标签和参数名称
//: ### 默认参数值
print("_____________________默认参数值_____________________________")
func someFunctionDefalutValue(defalutValueOne:Int = 100){
    print("defaliutValueOne-\(defalutValueOne)")
}
someFunctionDefalutValue()

//: ### 可变参数  一个函数最多有一个可变参数
print("_____________________可变参数_____________________________")
func arithmeticMean(_ numbers:Double...)->Double{
    if numbers.isEmpty {
        return 0.0
    }
    
    var total:Double = 0
    
    for value in numbers {
        total += value
    }
    
    return total/Double(numbers.count)
}
print ("平均数是 - \(arithmeticMean(1, 2, 3, 4, 5))")
print ("平均数是 - \(arithmeticMean(3, 8.25, 18.75))")

//: ### 输入输出参数  你只能传递变量给输入输出参数。你不能传入常量或者字面量，因为这些量是不能被修改的。当传入的参数作为输入输出参数时，需要在参数名前加 & 符，表示这个值可以被函数修改
/* OC
 - (void)exchagne:(NSString **)a b:(NSString **)b{
    NSString *tempStr = *a;
    *a = *b;
    *b = tempStr;
 }
 */
print("_____________________输入输出参数_____________________________")
func swapTwoInts(a: inout Int,b: inout Int){
    let tempA:Int = a
    a = b
    b = tempA
}

var swapOne = 35
var swapTwo = 37

print("原始 swapOne - \(swapOne) , swapTwo - \(swapTwo) ）")
swapTwoInts(a: &swapOne, b: &swapTwo)
print("改变后 swapOne - \(swapOne) , swapTwo - \(swapTwo) ）")


//: ### 函数类型作为返回类型
print("_____________________函数类型作为返回类型_____________________________")
//: 前进一步
func stepForward(input:Int) -> Int  {
    return input + 1
}
//: 后退一步
func stepBackward(input:Int) -> Int{
    return input - 1
}
//: 选择方法
func choseStepFunction(status:Bool) -> (Int)->(Int){
    
    return status ? stepBackward : stepForward
    
}
//: 具体调用
var currentNum = 3
let moveNearerToZero = choseStepFunction(status: currentNum > 0)

while currentNum != 0 {
    currentNum = moveNearerToZero(currentNum)
    print("currentNum - \(currentNum)")
}

//: ## 嵌套函数
print("_____________________嵌套函数_____________________________")
func choseStepAction(status:Bool) -> (Int)->(Int){
    func stepForwardAction(input:Int)->(Int){return input - 1}
    func stepBackwardAction(input:Int)->(Int){return input + 1}
    return status ? stepForwardAction : stepBackwardAction
}

var currentValue = 3
let moveNearerToZeroAction = choseStepAction(status: currentValue > 0)

while currentValue != 0 {
    currentValue = moveNearerToZero(currentValue)
    print("currentValue - \(currentValue)")
}

